package cn.gorit.user.service;

import cn.gorit.common.enums.ResultEnums;
import cn.gorit.common.lang.Result;
import cn.gorit.dto.content.BlogDto;
import cn.gorit.dto.user.ColDto;
import cn.gorit.entity.user.Collection;
import cn.gorit.mapper.user.ColMapper;
import cn.gorit.utils.Page;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.util.JSONPObject;
import com.fasterxml.jackson.databind.util.JSONWrappedObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.List;

/**
 * @version v1.0
 * @Classname CollectionService
 * @Description 收藏夹相关接口
 * @Author Gorit
 * @Created by 2021/3/8 23:55
 * @IDLE IntelliJ IDEA
 **/
@Service
public class CollectionService {

    @Autowired
    private ColMapper mapper;

    @Autowired
    private RestTemplate template;

    @Autowired
    LoadBalancerClient loadBalancerClient;

    // 联表查询来做
    public Result<Page<ColDto>> getByPage(Page<ColDto> page) {
        // 条件查询，根据 userId 查询 count
        List<ColDto> list = mapper.getByPage(page);
        page.setList(list);
        int total = mapper.getCountByPage(page);
        page.setTotalCount(total);
        return new Result<>(ResultEnums.QUERY_SUCCESS.getCode(),ResultEnums.QUERY_SUCCESS.getMsg(),page);
    }

    // 用户收藏 ID （用户看文章的时候，会注意是否已经收藏）
    public Result<Object> add(String blogId, String userId) {
        // 这个 userId 从 sessionStorage 中获取
        // 收藏采用组合 ID：userId + blogId 形成组合 ID，来保证唯一 ID
        Collection collection = new Collection();
        collection.setCollectionId(userId + blogId);
        collection.setUserId(userId);
        collection.setBlogId(blogId);
        mapper.saveCol(collection);
        // 收藏成功的内容，同步 RPC 远程更新至 cloud-myblog-content 中的 blog 中
        ServiceInstance serviceInstance = loadBalancerClient.choose("cloud-myblog-content-8002");
        String url = "http://" + serviceInstance.getServiceId() + "/api/v1/front/blog/col";
        BlogDto dto = new BlogDto();
        dto.setBlogId(blogId);
        dto.setBlogCollection(getByBlogId(blogId));
        template.put(url,dto);// 更新 blog 收藏的数量
        return new Result<>(ResultEnums.COLLECT_SUCCESS.getCode(),ResultEnums.COLLECT_SUCCESS.getMsg());
    }

    // 用户取消收藏
    public Result<Object> del(String blogId, String userId) {
        // 进入 redis 缓存三分钟，并不会实际上删除，当 redis 实际删除的时候，就是真正的删除

        // redis 逻辑

        // 真正删除的逻辑
        // 根据 sa-token 获取当前登录的用户 ID
        mapper.deleteCol(userId + blogId);
        // 同步 RPC 更新
        ServiceInstance serviceInstance = loadBalancerClient.choose("cloud-myblog-content-8002");
        String url = "http://" + serviceInstance.getServiceId() + "/api/v1/front/blog/col";
        BlogDto dto = new BlogDto();
        dto.setBlogId(blogId);
        Integer count = getByBlogId(blogId) - 1;
        if (count <= 0)
            count = 0;
        dto.setBlogCollection(count);
        template.put(url,dto);// 远程更新
        return new Result<>(ResultEnums.SUCCESS.getCode(),"取消收藏成功");
    }

    // 查看帖子的收藏状态
    public Result<Object> queryColStatus(String userId, String blogId) {
        Integer count = mapper.getBlogColStatus(userId+blogId);
        if (count > 0)
            return new Result<>(ResultEnums.QUERY_SUCCESS.getCode(),ResultEnums.SUCCESS.getMsg(),true);
        return new Result<>(ResultEnums.QUERY_SUCCESS.getCode(),ResultEnums.SUCCESS.getMsg(),false);
    }

    // RPC 远程调用查询 blogId 的信息，需要 content 模块开发完毕可以辨析该接口
    public Result<Object> getColDetail(String blogId) {
        ServiceInstance serviceInstance = loadBalancerClient.choose("cloud-myblog-content-8002");
        String url = "http://" + serviceInstance.getServiceId() + "/api/v1/blog/" + blogId;
        String dto = template.getForObject(url,String.class);
        return new Result<>(ResultEnums.QUERY_SUCCESS.getCode(),ResultEnums.QUERY_SUCCESS.getMsg(),dto);
    }

    // 根据 blogId 获取文章被收藏的次数
    public Integer getByBlogId(String blogId) {
        return mapper.getCollectionCountByBlogId(blogId);
    }


}
